#!/bin/bash
echo "===== rsync 文件同步 ======"
# =====================解释说明=========================
#使用前：先配置/etc/hosts，文件同步将发往：mini2,mini3，多机器需和本机是同一用户，比如都为root。
#[root@mini1 ~]# cat /etc/hosts
#127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#192.168.56.101 mini1
#192.168.56.102 mini2
#192.168.56.103 mini3


#使用二：调用脚本形式：xsync 文件名称（比如：xsync /home/lovelemoncat/bin）
#全局使用注意：如果将xsync放到/home/atguigu/bin目录下仍然不能实现全局使用，可以将xsync移动到/usr/local/bin目录下。

#=====================程序开始=========================
#1 获取输入参数个数，如果没有参数，直接退出
FILE_COUNT=$#
if((FILE_COUNT==0)); then
    echo "错误：未传递文件参数（绝对路径 或 相对路径名）"
    echo "用法：xsync 文件名称 [文件名称] ..."
    exit;
fi

#2 当前用户
USER=`whoami`
#3 解析文件绝对路径
for file in "$@"; do
    # 获取上级目录到绝对路径
    FILE_DIR=`cd -P $(dirname $file); pwd`
    # 获取文件名称
    FILE_NAME=`basename $file`
    # 拼接绝路路径
    FILE_PATH="$FILE_DIR/$FILE_NAME"
    # 文件如果存在，则开始同步
    if [ -e "$FILE_PATH" ]; then
        echo ">>> 开始同步：$FILE_PATH"

        #>>>>>>>>>>>>>>>>>>>>>> 取hosts中主机开始 >>>>>>>>>>>>>>>>>>>>>>>>>>>>
        SELF_HOST_NAME=$(hostname)
        #IFS设置IFS环境变量，这个变量是用来定义分隔符类型的。默认的分隔符为空格、换行符、tab。
        IFS_old=$IFS
        IFS=$'\n'
        for host in `grep -v localhost /etc/hosts | awk '{print($2)}'`; do
            # $item  如：192.168.56.101 mini1
            if [ "$host" != "$SELF_HOST_NAME" ]; then
                echo "rsync -rvl $FILE_DIR/$FILE_NAME $USER@$host:$FILE_DIR"
                rsync -rvl $FILE_DIR/$FILE_NAME $USER@$host:$FILE_DIR
                # echo ""
            # else
                # echo "<<< 本机无需同步：$host"
            fi
        done
        #将IFS变量还原为默认值
        IFS=$IFS_old
        #>>>>>>>>>>>>>>>>>>>>>> 取hosts中主机结束 >>>>>>>>>>>>>>>>>>>>>>>>>>>>
    else
        echo "路径不存在：FILE_PATH"
    fi
done